#ifndef CPP_GIFVIEW_H
#define CPP_GIFVIEW_H

#include <MiniGui.h>
#include <minigui/ctrl/animation.h>
#include <widget/CompoundButton.h>
#include <utils/Timer.h>

//@brief Gif动画
//@author cvte
//@description 用于GIF的播放
class GifView : public CompoundButton {
   public:
    GifView();
    ~GifView();

    //切换动画完成监听
    class OnGifViewSwitchFinishedListener {
       public:
        virtual void onGifViewSwitchFinished(GifView& gifView);
    };

    //动画播放完成一次监听
    class OnGifViewPlayFinishListener {
       public:
        virtual void onGifViewPlayFinished(GifView& gifView);
    };

    void loadGifFromFilePath(const char* filePath);
    //@method 设定动画帧间隔时间
    void setInterval(int intervalMs);
    void start();
    void start(int intervalMs);
    void pause();
    void stop();
    //@method 设置为切换模式，gif的第一帧和最后一帧分别代表两种状态
    void setSwitchMode(bool isSwitchMode);
    bool isSwitchMode();
    //@method 设置是否循环播放，默认循环播放
    void setLoop(bool isLoop);
    bool isLoop();
    //@method 当前是否是最后一帧
    bool isLastAnimFrame();
    //@method 设置在当前画面延时的次数，每次延时一个间隔时间
    void setDelayCount(int delayCount);
    //@method 获取在当前画面延时的次数，每次延时一个间隔时间
    int getDelayCount();
    //@method 是否在切换动画过程中
    bool isSwitching();
    void setOnSwitchFinishedListener(OnGifViewSwitchFinishedListener& listener);
    OnGifViewSwitchFinishedListener* getOnSwitchFinishedListener();
    void setOnPlayFinishListener(OnGifViewPlayFinishListener& listener);
    OnGifViewPlayFinishListener* getOnPlayFinishListener();
    //@method 是否加载完成
    bool isGifLoadFinished();

   protected:
    void onDraw(Canvas& canvas);
    void onClicked();

   private:
    ANIMATION* mAnimation = nullptr;
    ANIMATIONFRAME* mAnimationFrameCur = nullptr; //当前帧
    ANIMATIONFRAME* mAnimationFrameEnd = nullptr; //最后一帧
    int mAnimationIntervalMs = 40;
    bool mIsLoop = true;
    Timer mTimer;
    bool mIsSwitchMode = false;
    HDC mMemDC = nullptr; //保存gif的临时内存空间
    int mDelayCount = 0; //延时次数

    OnGifViewSwitchFinishedListener* mOnSwitchFinishedListener = nullptr;
    OnGifViewPlayFinishListener* mOnPlayFinishedListener = nullptr;

    void setupAnimMemDC(ANIMATION* pAnim); //初始化临时内存空间
    void animTreatFrameDisposal(ANIMATIONFRAME* frame); //回溯处理过去的帧画面
    void drawFrame(ANIMATIONFRAME* frame); //将帧画面绘制到临时内存空间
    void restoreBkColor(ANIMATIONFRAME* frame); //绘制背景颜色
    void restorePrevFrame(ANIMATIONFRAME* frame); //绘制前一帧

    bool mGifLoadFinished = false;
};

#endif /* CPP_GIFVIEW_H */